<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link rel="stylesheet" type="text/css" href="../公用CSS文件/all.css" />
    <script type="text/javascript" src="../js/jquery.min.js"></script> 	<script type="text/javascript" src="../js/js.js"></script>
    <meta charset="utf-8">
    <style type="text/css">
        table{min-width:80%}
    </style>
</head>
<body>

<div class="dt">事件循环和执行栈</div>
<ul>
    <div class="ltable showimg">事件循环</div>
    <div class="img">
        <li>js本身是单线程、非阻塞的设计，为了满足更多样化的程序逻辑需求，提供了一种机制来处理程序中多个块的执行，且执行每块时调用JavaScript引擎，这种机制被称为事件循环</li>
    </div>

    <div class="ltable showimg">执行栈</div>
    <div class="img">
        <table>
            <tr>
                <th>类型</th><th>说明</th>
            </tr>
            <tr>
                <td>宏观任务</td><td>由宿主发起的任务，JavaScript引擎本身并没有时间的概念，所以setTimeout、setInterval属于该类</td>
            </tr>
            <tr>
                <td>微观任务</td><td>由javascript引擎发起的任务,Promise函数、ajax等会将产生的异步任务放入对应的微观任务队列的尾部</td>
            </tr>
        </table>
        <li>执行栈的执行顺序为微观任务队列->宏观任务</li>
    </div>
</ul>

<div class="dt">Promise对象</div>
<ul>
    <div class="ltable showimg">Promise概述</div>
    <div class="img">
        <li>早期的javascript本身是一种单线程，异步任务Ajax、setTimeout是由宿主环境(浏览器)发起的，控制程序走向的信息由宿主决定，且Ajax等依据传统的ES5之前的语法异步逻辑不利于复用，在ES5后，
            引入了Promise对象，让javascript引擎本身可以发起异步任务，并在异步执行的流程中，把执行代码和处理结果的代码清晰地分离，此外还提供了并行异步执行的功能</li>
    </div>

    <div class="ltable showimg">Promise基本使用</div>
    <div class="img">
        <img src="img/Promise基本使用.png"/>
    </div>

    <div class="ltable showimg">Promise对象方法</div>
    <div class="img">
        <table>
            <tr>
                <th>方法</th><th>参数</th><th>作用</th><th>返回值</th>
            </tr>
            <tr>
                <td>reject</td>
                <td>字符串reason</td>
                <td>把Promise对象的状态修改为rejected</td>
                <td>Promise对象</td>
            </tr>
            <tr>
                <td>resolve</td>
                <td>字符串reason</td>
                <td>把Promise对象的状态修改为fullfiled</td>
                <td>Promise对象</td>
            </tr>
            <tr>
                <td>then</td>
                <td>函数resole  函数reject</td>
                <td>为Promise对象指定返回结果时执行的回调函数</td>
                <td>Promise对象</td>
            </tr>
            <tr>
                <td>catch</td>
                <td>函数reject</td>
                <td>为Promise对象指定执行失败或异常时执行的回调函数，如果then定义了reject函数在正常执行失败时使用执行then的回调(优先级更低)</td>
                <td>Promise对象</td>
            </tr>
            <tr>
                <td>all</td>
                <td>arr【Promise对象...】</td>
                <td>并行执行Promise任务，并根据结果决定该次Promise状态是rejected还是fullfiled</td>
                <td>Promise对象</td>
            </tr>
            <tr>
                <td>race</td>
                <td>arr【Promise对象...】</td>
                <td>并行执行Promise任务，并依据参数数组中最先执行完成的Promise的状态设置状态(忽略不是Promise的值)</td>
                <td>Promise对象</td>
            </tr>
        </table>
        <li>Promise.all的参数数组中，如果参数数组中有一个值不是Promise对象或有一个Promise对象状态为rejected则状态就为rejected，全部Promise对象为fullfiled状态时状态为fullfiled</li>
        <li>Promise.all的参数数组如果所有值都不是Promise，也会设置状态为fullfiled，不过这是非正常用法</li>
    </div>
</ul>



</body>
</html>